package com.skyd.core.android;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.skyd.core.vector.Vector2DF;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;

/**
 * Android系统常用功能封装
 * 
 * @author SkyD
 * 
 */
public final class Android {

	/**
	 * 创建外部包的上下文对象，如果不存在或遭遇其他异常则返回null
	 * 
	 * @param c
	 *            当前Context对象（Activity）
	 * @param packageName
	 *            目标默认包名
	 * @return 外部包的上下文对象，如果不存在或遭遇其他异常则返回null
	 */
	public static Context createPackageContext(Context c, String packageName) {
		Context otherAppsContext = null;
		try {
			otherAppsContext = c.createPackageContext(packageName, 0);
		} catch (Exception e) {
			return null;
		}
		return otherAppsContext;
	}

	/**
	 * 获取共享数据，用于持久化程序数据
	 * 
	 * @param c
	 *            当前Context对象（Activity）
	 * @param appkey
	 *            程序键名
	 * @return SharedPreferences对象
	 */
	public static SharedPreferences getSharedPreferences(Context c,
			String appkey) {
		return getSharedPreferences(c, appkey, Context.MODE_PRIVATE);
	}

	/**
	 * 获取共享数据，用于持久化程序数据
	 * 
	 * @param c
	 *            当前Context对象（Activity）
	 * @param appkey
	 *            程序键名
	 * @param permission
	 *            共享读写权限,如Context.MODE_WORLD_READABLE、Context.MODE_PRIVATE
	 * @return SharedPreferences对象
	 * 
	 */
	public static SharedPreferences getSharedPreferences(Context c,
			String appkey, int permission) {
		return c.getSharedPreferences(appkey, permission);
	}

	/**
	 * 用系统浏览器打开网址
	 * 
	 * @param c
	 *            当前Context对象（Activity）
	 * @param url
	 *            Url
	 */
	public static void openUrl(Context c, String url) {
		Uri uri = Uri.parse(url);
		Intent intent = new Intent(Intent.ACTION_VIEW, uri);
		c.startActivity(intent);
	}

	/**
	 * 用系统浏览器打开网址
	 * 
	 * @param c
	 *            当前Context对象（Activity）
	 * @param resourceID
	 *            资源ID
	 */
	public static void openUrl(Context c, int resourceID) {
		openUrl(c, c.getResources().getString(resourceID));
	}

	/**
	 * 分享文本内容给其他程序
	 * 
	 * @param act
	 *            当前Activity
	 * @param title
	 *            标题
	 * @param content
	 *            内容
	 */
	public static void shareText(Activity act, String title, String content) {
		Intent sintent = new Intent(Intent.ACTION_SEND);
		sintent.setType("text/plain");
		sintent.putExtra(Intent.EXTRA_SUBJECT, title);
		sintent.putExtra(Intent.EXTRA_TEXT, content);
		act.startActivity(Intent.createChooser(sintent, act.getTitle()));
	}

	/**
	 * 通过反射调用MotionEvent对象的getX(int
	 * pointerIndex)方法以获取多点触摸数据，该方法是在5级API中的，为了兼容低版本系统，故使用反射方法。
	 * 
	 * @param e
	 *            MotionEvent对象
	 * @param pointerIndex
	 *            触点索引
	 * @return X坐标
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static float reflectionGetMotionEventX(MotionEvent e,
			int pointerIndex) throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, IllegalAccessException,
			InvocationTargetException {
		Class<? extends MotionEvent> c = e.getClass();
		Method m = c.getMethod("getX", new Class[] { int.class });
		Object o = m.invoke(e, new Object[] { pointerIndex });
		return (Float) o;
	}

	/**
	 * 通过反射调用MotionEvent对象的getY(int
	 * pointerIndex)方法以获取多点触摸数据，该方法是在5级API中的，为了兼容低版本系统，故使用反射方法。
	 * 
	 * @param e
	 *            MotionEvent对象
	 * @param pointerIndex
	 *            触点索引
	 * @return Y坐标
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static float reflectionGetMotionEventY(MotionEvent e,
			int pointerIndex) throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, IllegalAccessException,
			InvocationTargetException {
		Class<? extends MotionEvent> c = e.getClass();
		Method m = c.getMethod("getY", new Class[] { int.class });
		Object o = m.invoke(e, new Object[] { pointerIndex });
		return (Float) o;
	}

	/**
	 * 通过反射调用MotionEvent对象的方法以获取多点触摸数据，这些方法是在5级API中的，为了兼容低版本系统，故使用反射方法。
	 * 
	 * @param e
	 *            MotionEvent对象
	 * @param pointerIndex
	 *            触点索引
	 * @return 坐标位置
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static Vector2DF reflectionGetMotionEventPosition(MotionEvent e,
			int pointerIndex) throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, IllegalAccessException,
			InvocationTargetException {
		return new Vector2DF(reflectionGetMotionEventX(e, pointerIndex),
				reflectionGetMotionEventY(e, pointerIndex));
	}

	/**
	 * 通过反射调用MotionEvent对象的getPointerCount()方法以获取多点触摸数据，该方法是在5级API中的，为了兼容低版本系统，
	 * 故使用反射方法。
	 * 
	 * @param e
	 *            MotionEvent对象
	 * @return 触摸点总数
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static int reflectionGetMotionEventPointerCount(MotionEvent e)
			throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, IllegalAccessException,
			InvocationTargetException {
		Class<? extends MotionEvent> c = e.getClass();
		Method m = c.getMethod("getPointerCount", new Class[] {});
		Object o = m.invoke(e, new Object[] {});
		return (Integer) o;
	}

	/**
	 * 将Activity设为全屏幕显示，该方法应在onCreate中setContentView之前执行
	 * 
	 * @param act
	 */
	public static void setToFullScreen(Activity act) {
		/** 全屏设置，隐藏窗口所有装饰 */
		act.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		/** 标题是属于View的，所以窗口所有的修饰部分被隐藏后标题依然有效 */
		act.requestWindowFeature(Window.FEATURE_NO_TITLE);
		act.getWindow().setFlags(
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
	}

	/**
	 * 设置为禁止屏幕休眠待机，该方法应在onCreate中setContentView之前执行
	 * 
	 * @param act
	 */
	public static void setToKeepScreenOn(Activity act) {
		act.getWindow().setFlags(
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
	}

	/**
	 * 获取SD卡目录对象
	 * @return SD卡目录对象
	 */
	public static File getSDCardDirectory() {
		return android.os.Environment.getExternalStorageDirectory();
	}
	
	/**
	 * 打开一个Activity
	 * @param targetclass 目标Activity的类型
	 * @param c 当前上下文对象
	 */
	public static void openActivity(Context c,Class<? extends Activity> targetclass){
		openActivity(new Intent(),c,targetclass);
	}
	
	/**
	 * 打开一个Activity
	 * @param intent 传递的Intent
	 * @param targetclass 目标Activity的类型
	 * @param c 当前上下文对象
	 */
	public static void openActivity(Intent intent,Context c,Class<? extends Activity> targetclass){
		intent.setClass(c, targetclass);
			c.startActivity(intent);
	}
}
